package com.zhihuishu.micro.course.helper;

import java.util.Date;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.able.base.logger.client.AbleLogHelper;

/**
 * 远程日志记录封装
 * @author	zhanglikun
 * @date	2015年12月14日 上午8:58:30
 */
public class RemoteLogHelper {

private static final Logger log = LoggerFactory.getLogger(RemoteLogHelper.class) ;
	
	private static final Executor exec = Executors.newFixedThreadPool(20) ;
	/** 默认模块：未归类模块 */
	private static final int DEFAULT_MODULE = 1 ;
	
	/**
	 * 记录远程日志，使用默认模块
	 * @param msg		日志消息
	 * @param params	日志参数
	 */
	public static final void log(String msg ,Object ... params) {
		log(null ,msg ,params) ;
	}
	
	/**
	 * 记录远程日志，使用默认模块
	 * @param userId	用户ID
	 * @param msg		日志消息
	 * @param params	日志参数
	 */
	public static final void log(Long userId ,String msg ,Object ... params) {
		log(DEFAULT_MODULE ,userId ,msg ,params) ;
	}
	
	/**
	 * 写入远程日志，以独立线程方式写入，避免性能问题
	 * @param module	日志模块
	 * @param userId	用户ID (允许为空)
	 * @param msg		日志消息
	 * @param params	日志参数
	 */
	public static final void log(final int module ,final Long userId ,final String msg ,final Object ... params) {
		exec.execute(new Runnable() {
			@Override
			public void run() {
				try {
					_log(module ,userId ,msg ,params) ;
				} catch (Exception e) {
					log.warn("日志发送失败，尝试重发一次!");
					try {
						_log(module ,userId ,msg ,params) ;
					} catch (Exception ex) {
						ex.printStackTrace();
					}
				}
			}
		});
	}
	
	/**
	 * 实际发送日志方法
	 * @param module
	 * @param userId
	 * @param msg
	 * @param params
	 * @throws Exception
	 */
	private static final void _log(int module ,Long userId ,String msg ,Object ... params) throws Exception {
		AbleLogHelper helper = new AbleLogHelper().setProject("ms_course")
			.setModule(module)
			.setContent(assembly(msg ,params)) ;
			if(userId != null) helper.setUserId(userId) ;
			helper.send() ;
	}
	
	/**
	 * 组装参数
	 * @param msg
	 * @param params
	 * @return
	 */
	private static final String assembly(String msg ,Object ... params) {
		if(msg == null) return "" ;
		if(params != null && params.length > 0) {
			for(Object p : params) {
				if(StringUtils.isBlank(msg) || !StringUtils.contains(msg, "{}")) break ;
				msg = msg.replaceFirst("\\{\\}",p != null ? p.toString() : "") ;
			}
		}
		return msg ;
	}

	public static void main(String[] args) {
		
		System.err.println(assembly("-- {} -- {} --", new Date() ,100 ,"张三"));
		System.err.println(assembly("-- {} -- {} -- {} -- {} --", new Date() ,100 ,"张三"));
		
	}
	
}
